Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Feature model</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Feature_model"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Feature_model rootpage-Feature_model skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Feature model</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">This article is about feature models in software development. For feature models in semantic memory, see <a href="Semantic_memory#Feature_models" title="Semantic memory">Semantic memory §&nbsp;Feature models</a>.</div>
<p>In software development, a <b>feature model</b> is a compact representation of all the products of the <a href="Software_Product_Line" class="mw-redirect" title="Software Product Line">Software Product Line</a> (SPL) in terms of "features". Feature models are visually represented by means of feature diagrams. Feature models are widely used during the whole product line development process and are commonly used as input to produce other assets such as documents, architecture definition, or pieces of code.
</p><p>A SPL is a family of related programs. When the units of program construction are features—increments in program functionality or development—every program in an SPL is identified by a unique and legal combination of features, and vice versa.
</p><p>Feature models were first introduced in the <a href="Feature-Oriented_Domain_Analysis" class="mw-redirect" title="Feature-Oriented Domain Analysis">Feature-Oriented Domain Analysis</a> (FODA) method by Kang in 1990.<sup id="cite_ref-KangEtAl90_1-0" class="reference"><a href="#cite_note-KangEtAl90-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> Since then, feature modeling has been widely adopted by the software product line community and a number of extensions have been proposed.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Background">Background</h2></div>
<p>A "feature" is defined as a "prominent or distinctive user-visible aspect, quality, or characteristic of a <a href="Software_system" title="Software system">software system</a> or system".<sup id="cite_ref-KangEtAl90_1-1" class="reference"><a href="#cite_note-KangEtAl90-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> The focus of SPL development is on the systematic and efficient creation of similar programs. FODA is an analysis devoted to identification of features in a domain to be covered by a particular SPL.<sup id="cite_ref-KangEtAl90_1-2" class="reference"><a href="#cite_note-KangEtAl90-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Model">Model</h3></div>
<p>A feature model is a model that defines features and their dependencies, typically in the form of a feature diagram + left-over (a.k.a. cross-tree) constraints. But also it could be as a table of possible combinations.
</p>
<div class="mw-heading mw-heading3"><h3 id="Diagram">Diagram</h3></div>
<p>A feature diagram is a visual notation of a feature model, which is basically an and-or tree. Other extensions exist: <a href="Cardinalities" class="mw-redirect" title="Cardinalities">cardinalities</a>, feature cloning, feature attributes, discussed below.
</p>
<div class="mw-heading mw-heading3"><h3 id="Configuration">Configuration</h3></div>
<p>A feature configuration is a set of features that describes a member of an SPL: the member contains a feature if and only if the feature is in its configuration. A feature configuration is permitted by a feature model if and only if it does not violate constraints imposed by the model...
</p>
<div class="mw-heading mw-heading3"><h3 id="Feature_Tree">Feature Tree</h3></div>
<p>A Feature Tree (sometimes also known as a Feature Model or Feature Diagram) is a hierarchical diagram that visually depicts the features of a solution in groups of increasing levels of detail.
Feature Trees are great ways to summarize the features that will be included in a solution and how they are related in a simple visual manner.
<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Feature_modeling_notations">Feature modeling notations</h2></div>
<p>Current feature modeling notations may be divided into three main groups, namely:
</p>
<ul><li>Basic feature models</li>
<li>Cardinality-based feature models</li>
<li>Extended feature models</li></ul>

<div class="mw-heading mw-heading3"><h3 id="Basic_feature_models">Basic feature models</h3></div>
<p>Relationships between a parent feature and its child features (or sub-features) are categorized as:
</p>
<ul><li>Mandatory&nbsp;– child feature must be selected.</li>
<li>Optional&nbsp;– child feature can be selected or not selected.</li>
<li>Or&nbsp;– at least one of the sub-features must be selected.</li>
<li>Alternative (xor)&nbsp;– exactly one of the sub-features must be selected.</li></ul>
<p>In addition to the parental relationships between features, cross-tree constraints are allowed. The most common are:
</p>
<ul><li>A requires B&nbsp;– The selection of A in a product implies the selection of B.</li>
<li>A excludes B&nbsp;– A and B cannot be part of the same product.</li></ul>
<p>As an example, the figure to the right illustrates how feature models can be used to specify and build configurable on-line shopping systems. The software of each application is determined by the features that it provides. The root feature (i.e. E-Shop) identifies the SPL. Every shopping system implements a catalogue, payment modules, security policies and optionally a search tool. E-shops must implement a high or standard security policy (choose one), and can provide different payment modules: bank transfer, credit card or both of them. Additionally, a cross-tree constraint forces shopping systems including the credit card payment module to implement a high security policy.
</p>
<div class="mw-heading mw-heading3"><h3 id="Cardinality-based_feature_models">Cardinality-based feature models</h3></div>
<p>Some authors propose extending basic feature models with <a href="Unified_Modeling_Language" title="Unified Modeling Language">UML</a>-like multiplicities of the form <i>[n,m]</i> with <i>n</i> being the lower bound and <i>m</i> the upper bound. These are used to limit the number of sub-features that can be part of a product whenever the parent is selected.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>
</p><p>If the upper bound is <i>*</i> the feature can be cloned as many times as we want (as long as the other constraints are respected). This notation is useful for products extensible with an arbitrary number of components.
</p>
<div class="mw-heading mw-heading3"><h3 id="Extended_feature_models">Extended feature models</h3></div>
<p>Others suggest adding extra-functional information to the features using "attributes". These are mainly composed of a name, a domain, and a value.<sup id="cite_ref-benavides05-caise_4-0" class="reference"><a href="#cite_note-benavides05-caise-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Semantics">Semantics</h2></div>
<p>The semantics of a feature model is the set of feature configurations that the feature model permits. The most common approach is to use mathematical logic to capture the semantics of a feature diagram.<sup id="cite_ref-Schobbens_5-0" class="reference"><a href="#cite_note-Schobbens-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> Each feature corresponds to a <a href="Boolean_variable" class="mw-redirect" title="Boolean variable">boolean variable</a> and the semantics is captured as a <a href="Propositional_formula" title="Propositional formula">propositional formula</a>. The satisfying valuations of this formula correspond to the feature configurations permitted by the feature diagram.
For instance, if <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}}</annotation>
</semantics>
</math></span><img src="./50dfd257a51e037112c917f8a9e47c9c053466df.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.193ex; height:2.509ex;" alt="{\displaystyle f_{1}}" loading="lazy"></span> is a mandatory sub-feature of <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{2}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{2}}</annotation>
</semantics>
</math></span><img src="./cc886fdaa7adc9be11ff4a5076da5e0943bcff58.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.193ex; height:2.509ex;" alt="{\displaystyle f_{2}}" loading="lazy"></span>, the formula will contain the constraint <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}\Leftrightarrow f_{2}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo stretchy="false">⇔<!-- ⇔ --></mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}\Leftrightarrow f_{2}}</annotation>
</semantics>
</math></span><img src="./a80e94960118e2ea391fb204db3dcbcc9b94086e.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:8.001ex; height:2.509ex;" alt="{\displaystyle f_{1}\Leftrightarrow f_{2}}" loading="lazy"></span>.<sup id="cite_ref-Duran_6-0" class="reference"><a href="#cite_note-Duran-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p><p>The following table provides a translation of the basic primitives. We assume that the diagram is a rooted tree with root <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle r}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>r</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle r}</annotation>
</semantics>
</math></span><img src="./0d1ecb613aa2984f0576f70f86650b7c2a132538.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.049ex; height:1.676ex;" alt="{\displaystyle r}" loading="lazy"></span>. The semantics of a whole diagram is a conjunct of the translations of the elements contained in the diagram. Therefore, in case all elements are written in <a href="Conjunctive_normal_form" title="Conjunctive normal form">Conjunctive normal form</a> (CNF), then the terms can easily be combined with logical AND and the whole logical expression will remain in CNF.
</p>
<table class="wikitable" border="1">

<tbody><tr>
<th>Feature Diagram Primitive
</th>
<th>Semantics
</th>
<th>Semantics in <a href="Conjunctive_normal_form" title="Conjunctive normal form">Conjunctive normal form</a>
</th></tr>
<tr>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle r}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>r</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle r}</annotation>
</semantics>
</math></span><img src="./0d1ecb613aa2984f0576f70f86650b7c2a132538.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.049ex; height:1.676ex;" alt="{\displaystyle r}" loading="lazy"></span> is the root feature
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle r}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>r</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle r}</annotation>
</semantics>
</math></span><img src="./0d1ecb613aa2984f0576f70f86650b7c2a132538.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.049ex; height:1.676ex;" alt="{\displaystyle r}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle r}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>r</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle r}</annotation>
</semantics>
</math></span><img src="./0d1ecb613aa2984f0576f70f86650b7c2a132538.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.049ex; height:1.676ex;" alt="{\displaystyle r}" loading="lazy"></span>
</td></tr>
<tr>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}}</annotation>
</semantics>
</math></span><img src="./50dfd257a51e037112c917f8a9e47c9c053466df.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.193ex; height:2.509ex;" alt="{\displaystyle f_{1}}" loading="lazy"></span> mandatory sub-feature of <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f}</annotation>
</semantics>
</math></span><img src="./132e57acb643253e7810ee9702d9581f159a1c61.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:1.279ex; height:2.509ex;" alt="{\displaystyle f}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}\Leftrightarrow f}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo stretchy="false">⇔<!-- ⇔ --></mo>
<mi>f</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}\Leftrightarrow f}</annotation>
</semantics>
</math></span><img src="./48eae04c5758f53783e16533030fcdfca481e645.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:7.086ex; height:2.509ex;" alt="{\displaystyle f_{1}\Leftrightarrow f}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (f_{1}\lor \lnot f)\land (\lnot f_{1}\lor f)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<mi>f</mi>
<mo stretchy="false">)</mo>
<mo>∧<!-- ∧ --></mo>
<mo stretchy="false">(</mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mi>f</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle (f_{1}\lor \lnot f)\land (\lnot f_{1}\lor f)}</annotation>
</semantics>
</math></span><img src="./e20d6d7d5ed21ab178777819eefe43e5b5973111.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:21.411ex; height:2.843ex;" alt="{\displaystyle (f_{1}\lor \lnot f)\land (\lnot f_{1}\lor f)}" loading="lazy"></span>
</td></tr>
<tr>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}}</annotation>
</semantics>
</math></span><img src="./50dfd257a51e037112c917f8a9e47c9c053466df.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.193ex; height:2.509ex;" alt="{\displaystyle f_{1}}" loading="lazy"></span> optional sub-feature of <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f}</annotation>
</semantics>
</math></span><img src="./132e57acb643253e7810ee9702d9581f159a1c61.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:1.279ex; height:2.509ex;" alt="{\displaystyle f}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}\Rightarrow f}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo stretchy="false">⇒<!-- ⇒ --></mo>
<mi>f</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}\Rightarrow f}</annotation>
</semantics>
</math></span><img src="./0977ac9998422dafe7c99ad24eaaecefb220524a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:7.086ex; height:2.509ex;" alt="{\displaystyle f_{1}\Rightarrow f}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (\lnot f_{1}\lor f)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mi>f</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle (\lnot f_{1}\lor f)}</annotation>
</semantics>
</math></span><img src="./67dc20eba7757530a3e8cbe6cd3a43bed6e725b5.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:9.414ex; height:2.843ex;" alt="{\displaystyle (\lnot f_{1}\lor f)}" loading="lazy"></span>
</td></tr>
<tr>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1},\dots ,f_{n}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>…<!-- … --></mo>
<mo>,</mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1},\dots ,f_{n}}</annotation>
</semantics>
</math></span><img src="./4ffaca6f126cfa337cfae1e0550e95362483dd5a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:9.729ex; height:2.509ex;" alt="{\displaystyle f_{1},\dots ,f_{n}}" loading="lazy"></span> or sub-features of <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f}</annotation>
</semantics>
</math></span><img src="./132e57acb643253e7810ee9702d9581f159a1c61.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:1.279ex; height:2.509ex;" alt="{\displaystyle f}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}\lor \dots \lor f_{n}\Leftrightarrow f}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>∨<!-- ∨ --></mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<mo stretchy="false">⇔<!-- ⇔ --></mo>
<mi>f</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}\lor \dots \lor f_{n}\Leftrightarrow f}</annotation>
</semantics>
</math></span><img src="./40e0a6735bf62489ceb3b3091c3582f1131e6ea7.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:17.332ex; height:2.509ex;" alt="{\displaystyle f_{1}\lor \dots \lor f_{n}\Leftrightarrow f}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (f_{1}\lor \dots \lor f_{n}\lor \lnot f)\land \bigwedge _{i=1\dots n}(\lnot f_{i}\lor f)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>∨<!-- ∨ --></mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<mi>f</mi>
<mo stretchy="false">)</mo>
<mo>∧<!-- ∧ --></mo>
<munder>
<mo>⋀<!-- ⋀ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>=</mo>
<mn>1</mn>
<mo>…<!-- … --></mo>
<mi>n</mi>
</mrow>
</munder>
<mo stretchy="false">(</mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mi>f</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle (f_{1}\lor \dots \lor f_{n}\lor \lnot f)\land \bigwedge _{i=1\dots n}(\lnot f_{i}\lor f)}</annotation>
</semantics>
</math></span><img src="./cff399a628c304e1695ad40bb5372fdea8018b28.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:36.982ex; height:5.509ex;" alt="{\displaystyle (f_{1}\lor \dots \lor f_{n}\lor \lnot f)\land \bigwedge _{i=1\dots n}(\lnot f_{i}\lor f)}" loading="lazy"></span>
</td></tr>
<tr>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1},\dots ,f_{n}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>…<!-- … --></mo>
<mo>,</mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1},\dots ,f_{n}}</annotation>
</semantics>
</math></span><img src="./4ffaca6f126cfa337cfae1e0550e95362483dd5a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:9.729ex; height:2.509ex;" alt="{\displaystyle f_{1},\dots ,f_{n}}" loading="lazy"></span> alternative (xor) sub-features of <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f}</annotation>
</semantics>
</math></span><img src="./132e57acb643253e7810ee9702d9581f159a1c61.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:1.279ex; height:2.509ex;" alt="{\displaystyle f}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left(f_{1}\lor \dots \lor f_{n}\Leftrightarrow f\right)\land \bigwedge _{i<j}\lnot (f_{i}\land f_{j})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>∨<!-- ∨ --></mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<mo stretchy="false">⇔<!-- ⇔ --></mo>
<mi>f</mi>
</mrow>
<mo>)</mo>
</mrow>
<mo>∧<!-- ∧ --></mo>
<munder>
<mo>⋀<!-- ⋀ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>&lt;</mo>
<mi>j</mi>
</mrow>
</munder>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<mo stretchy="false">(</mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>∧<!-- ∧ --></mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>j</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \left(f_{1}\lor \dots \lor f_{n}\Leftrightarrow f\right)\land \bigwedge _{i&lt;j}\lnot (f_{i}\land f_{j})}</annotation>
</semantics>
</math></span><img src="./fe5469243ca6fd876c0f73345be9c0a19461339d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.338ex; width:34.623ex; height:5.843ex;" alt="{\displaystyle \left(f_{1}\lor \dots \lor f_{n}\Leftrightarrow f\right)\land \bigwedge _{i<j}\lnot (f_{i}\land f_{j})}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (f_{1}\lor \dots \lor f_{n}\lor \lnot f)\land \bigwedge _{i=1\dots n}(\lnot f_{i}\lor f)\land \bigwedge _{i<j}(\lnot f_{i}\lor \lnot f_{j})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>∨<!-- ∨ --></mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<mi>f</mi>
<mo stretchy="false">)</mo>
<mo>∧<!-- ∧ --></mo>
<munder>
<mo>⋀<!-- ⋀ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>=</mo>
<mn>1</mn>
<mo>…<!-- … --></mo>
<mi>n</mi>
</mrow>
</munder>
<mo stretchy="false">(</mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mi>f</mi>
<mo stretchy="false">)</mo>
<mo>∧<!-- ∧ --></mo>
<munder>
<mo>⋀<!-- ⋀ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>&lt;</mo>
<mi>j</mi>
</mrow>
</munder>
<mo stretchy="false">(</mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>j</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle (f_{1}\lor \dots \lor f_{n}\lor \lnot f)\land \bigwedge _{i=1\dots n}(\lnot f_{i}\lor f)\land \bigwedge _{i&lt;j}(\lnot f_{i}\lor \lnot f_{j})}</annotation>
</semantics>
</math></span><img src="./60f98aa585d822e12ed49cf09a41255f3879cb7f.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.338ex; width:53.627ex; height:5.843ex;" alt="{\displaystyle (f_{1}\lor \dots \lor f_{n}\lor \lnot f)\land \bigwedge _{i=1\dots n}(\lnot f_{i}\lor f)\land \bigwedge _{i<j}(\lnot f_{i}\lor \lnot f_{j})}" loading="lazy"></span>
</td></tr>
<tr>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}}</annotation>
</semantics>
</math></span><img src="./50dfd257a51e037112c917f8a9e47c9c053466df.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.193ex; height:2.509ex;" alt="{\displaystyle f_{1}}" loading="lazy"></span> requires <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{2}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{2}}</annotation>
</semantics>
</math></span><img src="./cc886fdaa7adc9be11ff4a5076da5e0943bcff58.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.193ex; height:2.509ex;" alt="{\displaystyle f_{2}}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}\Rightarrow f_{2}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo stretchy="false">⇒<!-- ⇒ --></mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}\Rightarrow f_{2}}</annotation>
</semantics>
</math></span><img src="./b7d3d4bcddd5de973b58b85607cf8f3a2c2bfb31.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:8.001ex; height:2.509ex;" alt="{\displaystyle f_{1}\Rightarrow f_{2}}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (\lnot f_{1}\lor f_{2})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle (\lnot f_{1}\lor f_{2})}</annotation>
</semantics>
</math></span><img src="./381288746e8c29c7a83c5fdf1f934f44a70ecc5f.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:10.329ex; height:2.843ex;" alt="{\displaystyle (\lnot f_{1}\lor f_{2})}" loading="lazy"></span>
</td></tr>
<tr>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{1}}</annotation>
</semantics>
</math></span><img src="./50dfd257a51e037112c917f8a9e47c9c053466df.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.193ex; height:2.509ex;" alt="{\displaystyle f_{1}}" loading="lazy"></span> excludes <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{2}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{2}}</annotation>
</semantics>
</math></span><img src="./cc886fdaa7adc9be11ff4a5076da5e0943bcff58.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.193ex; height:2.509ex;" alt="{\displaystyle f_{2}}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \lnot (f_{1}\land f_{2})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<mo stretchy="false">(</mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∧<!-- ∧ --></mo>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \lnot (f_{1}\land f_{2})}</annotation>
</semantics>
</math></span><img src="./42aacdd63558b0a5ee611b69173b76330ed6cb29.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:10.329ex; height:2.843ex;" alt="{\displaystyle \lnot (f_{1}\land f_{2})}" loading="lazy"></span>
</td>
<td><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (\lnot f_{1}\lor \lnot f_{2})}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>∨<!-- ∨ --></mo>
<mi mathvariant="normal">¬<!-- ¬ --></mi>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle (\lnot f_{1}\lor \lnot f_{2})}</annotation>
</semantics>
</math></span><img src="./a63bc7a2fccbe6f7e3585171d5b88237d6ed78c6.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:11.879ex; height:2.843ex;" alt="{\displaystyle (\lnot f_{1}\lor \lnot f_{2})}" loading="lazy"></span>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Configuring_products">Configuring products</h2></div>
<p>A product of the SPL is declaratively specified by selecting or deselecting features according to user's preferences. Such decisions must respect the constraints imposed by the feature model. A "configurator" is a tool that assists the user during a configuration process. For instance by automatically selecting or deselecting features that must or must not, respectively, be selected for the configuration to be completed successfully. Current approaches use <a href="Unit_propagation" title="Unit propagation">unit propagation</a><sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> and <a href="Constraint_satisfaction_problem" title="Constraint satisfaction problem">CSP solvers</a>.<sup id="cite_ref-benavides05-caise_4-1" class="reference"><a href="#cite_note-benavides05-caise-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Properties_and_analyses">Properties and analyses</h2></div>
<p>An analysis of a feature model targets certain properties of the model which are important for marketing strategies or technical decisions. A number of analyses are identified in the literature.<sup id="cite_ref-benavides06-jisbd_8-0" class="reference"><a href="#cite_note-benavides06-jisbd-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-benavides10-is_9-0" class="reference"><a href="#cite_note-benavides10-is-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> Typical analyses determine whether a feature model is void (represents no products), whether it contains dead features (features that cannot be part of any product), or the number of products of the software product line represented by the model. Other analyses focus on comparing several feature models (e.g. to check whether a model is a <a href="Specialization_(logic)" class="mw-redirect" title="Specialization (logic)">specialization</a> or <a href="Code_refactoring" title="Code refactoring">refactoring</a> or <a href="Generalization" title="Generalization">generalization</a> of another).<sup id="cite_ref-thuem09-icse_10-0" class="reference"><a href="#cite_note-thuem09-icse-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Domain_analysis" title="Domain analysis">Domain analysis</a></li>
<li><a href="Domain_engineering" title="Domain engineering">Domain engineering</a></li>
<li><a href="FOSD" class="mw-redirect" title="FOSD">Feature-oriented Programming</a> - a paradigm for software product line synthesis</li>
<li><a href="Product_Family_Engineering" class="mw-redirect" title="Product Family Engineering">Product Family Engineering</a></li>
<li><a href="Software_product_line" title="Software product line">Software Product Lines</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-KangEtAl90-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-KangEtAl90_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-KangEtAl90_1-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-KangEtAl90_1-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text">Kang, K.C. and Cohen, S.G. and Hess, J.A. and Novak, W.E. and Peterson, A.S., "Feature-oriented domain analysis (FODA) feasibility study", Technical Report CMU/SEI-90-TR-021, SEI,
Carnegie Mellon University, November 1990
<a rel="nofollow" class="external text" href="http://www.sei.cmu.edu/reports/90tr021.pdf">download</a></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.bawiki.com/wiki/techniques/feature-tree/">"Feature Tree | BAwiki"</a>.</cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text">Czarnecki, K. and Helsen, S. and Eisenecker, U., "Staged configuration using feature models", Proceedings of the Third International Conference on Software Product Lines (SPLC '04), volume 3154 of Lecture Notes in Computer Science. Springer Berlin/Heidelberg, August 2004. <a rel="nofollow" class="external text" href="https://doi.org/10.1007%2F978-3-540-28630-1_17">download</a>.</span>
</li>
<li id="cite_note-benavides05-caise-4"><span class="mw-cite-backlink">^ <a href="#cite_ref-benavides05-caise_4-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-benavides05-caise_4-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text">D. Benavides, P. Trinidad and A. Ruiz-Cortés. "Automated Reasoning on Feature Models". 17th Conference on Advanced Information Systems Engineering (CAiSE'05). Porto, Portugal. 2005 <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170808235338/http://www.lsi.us.es/~dbc/dbc_archivos/pubs/caise05.pdf">download</a></span>
</li>
<li id="cite_note-Schobbens-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-Schobbens_5-0">^</a></b></span> <span class="reference-text">Schobbens, P.-Y.; Heymans, P.; Trigaux, J.-C., "<a rel="nofollow" class="external text" href="https://www.academia.edu/download/41176309/Feature_Diagrams_A_Survey_and_A_Formal_S20160115-568-1uikbv0.pdf">Feature Diagrams: A Survey and a Formal Semantics</a>," Requirements Engineering, 14th IEEE International Conference , vol., no., pp.139-148, 11-15 Sept. 2006 <a rel="nofollow" class="external text" href="https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=1704057&amp;isnumber=35962">download</a></span>
</li>
<li id="cite_note-Duran-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-Duran_6-0">^</a></b></span> <span class="reference-text">Amador Durán, David Benavides, Sergio Segura, Pablo Trinidad and Antonio Ruiz-Cortés "FLAME: a Formal Framework for the Automated Analysis of Software Product Lines Validated by Automated Specification Testing". Software and System Modeling. 2015. <a rel="nofollow" class="external text" href="https://link.springer.com/article/10.1007/s10270-015-0503-z">download</a></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text">Batory, D., "Feature Models, Grammars, and Propositional Formulas", Proceedings of the 9th International Software Product Line Conference (SPLC '05) <a rel="nofollow" class="external text" href="https://www.cs.utexas.edu/users/dsb/SPLC/Nominations/Batory05.pdf">download</a></span>
</li>
<li id="cite_note-benavides06-jisbd-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-benavides06-jisbd_8-0">^</a></b></span> <span class="reference-text">D. Benavides, A.Ruiz-Cortés, P. Trinidad and S. Segura. "<a rel="nofollow" class="external text" href="https://idus.us.es/xmlui/bitstream/handle/11441/26358/file_1.pdf?sequence=1&amp;isAllowed=y">A Survey on the Automated Analyses of Feature Models</a>" . Jornadas de Ingeniería del Software y Bases de Datos (JISBD'06). Sitges, Spain. 2006</span>
</li>
<li id="cite_note-benavides10-is-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-benavides10-is_9-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFBenavidesSeguraRuiz_Cortés2010" class="citation journal cs1">Benavides, David; Segura, Sergio; Ruiz Cortés, Antonio (2010). "Automated Analysis of Feature Models 20 Years Later: A Literature Review". <i>Information Systems</i>. <b>35</b> (6): <span class="nowrap">615–</span>636. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1016%2Fj.is.2010.01.001">10.1016/j.is.2010.01.001</a>. <a href="Hdl_(identifier)" class="mw-redirect" title="Hdl (identifier)">hdl</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://hdl.handle.net/11441%2F24694">11441/24694</a></span>.</cite></span>
</li>
<li id="cite_note-thuem09-icse-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-thuem09-icse_10-0">^</a></b></span> <span class="reference-text">T. Thuem, D. Batory, and C. Kaestner. "<a rel="nofollow" class="external text" href="ftp://www.cs.utexas.edu/pub/predator/ICSE2009.pdf">Reasoning about Edits to Feature Models</a>". International Conference on Software Engineering (ICSE), May 2009.</span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://archive.today/20090307175047/http://fm.gsdlab.org/">Feature Model Repository Wiki</a></li>
<li><a rel="nofollow" class="external text" href="http://www.methodsandtools.com/archive/archive.php?id=49">Software Product Line Engineering with Feature Models</a></li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}


/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Software_engineering336" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div id="Software_engineering336" style="font-size:114%;margin:0 4em"><a href="Software_engineering" title="Software engineering">Software engineering</a></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">Fields</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Computer_programming" title="Computer programming">Computer programming</a></li>
<li><a href="DevOps" title="DevOps">DevOps</a></li>
<li><a href="Empirical_software_engineering" title="Empirical software engineering">Empirical software engineering</a></li>
<li><a href="Experimental_software_engineering" title="Experimental software engineering">Experimental software engineering</a></li>
<li><a href="Formal_methods" title="Formal methods">Formal methods</a></li>
<li><a href="Requirements_engineering" title="Requirements engineering">Requirements engineering</a></li>
<li><a href="Search-based_software_engineering" title="Search-based software engineering">Search-based software engineering</a></li>
<li><a href="Site_reliability_engineering" title="Site reliability engineering">Site reliability engineering</a></li>
<li><a href="Social_software_engineering" title="Social software engineering">Social software engineering</a></li>
<li><a href="Software_deployment" title="Software deployment">Software deployment</a></li>
<li><a href="Software_design" title="Software design">Software design</a></li>
<li><a href="Software_maintenance" title="Software maintenance">Software maintenance</a></li>
<li><a href="Software_testing" title="Software testing">Software testing</a></li>
<li><a href="Systems_analysis" title="Systems analysis">Systems analysis</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Concepts</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Abstraction_(computer_science)" title="Abstraction (computer science)">Abstraction</a></li>
<li><a href="CI/CD" title="CI/CD">CI/CD</a></li>
<li><a href="Computer_compatibility" title="Computer compatibility">Compatibility</a>
<ul><li><a href="Backward_compatibility" title="Backward compatibility">Backward compatibility</a></li>
<li><a href="Compatibility_layer" title="Compatibility layer">Compatibility layer</a></li>
<li><a href="Compatibility_mode" title="Compatibility mode">Compatibility mode</a></li>
<li><a href="Forward_compatibility" title="Forward compatibility">Forward compatibility</a></li>
<li><a href="Software_incompatibility" title="Software incompatibility">Software incompatibility</a></li></ul></li>
<li><a href="Component-based_software_engineering" title="Component-based software engineering">Component-based software engineering</a></li>
<li><a href="Data_modeling" title="Data modeling">Data modeling</a></li>
<li><a href="Enterprise_architecture" title="Enterprise architecture">Enterprise architecture</a></li>
<li><a href="Functional_specification" title="Functional specification">Functional specification</a></li>
<li><a href="Modeling_language" title="Modeling language">Modeling language</a></li>
<li><a href="Programming_paradigm" title="Programming paradigm">Programming paradigm</a></li>
<li><a href="Software" title="Software">Software</a></li>
<li><a href="Software_archaeology" title="Software archaeology">Software archaeology</a></li>
<li><a href="Software_architecture" title="Software architecture">Software architecture</a></li>
<li><a href="Software_configuration_management" title="Software configuration management">Software configuration management</a></li>
<li><a href="Software_development_process" title="Software development process">Software development process/methodology</a></li>
<li><a href="Software_quality" title="Software quality">Software quality</a></li>
<li><a href="Software_quality_assurance" title="Software quality assurance">Software quality assurance</a></li>
<li><a href="Software_system" title="Software system">Software system</a></li>
<li><a href="Software_verification_and_validation" title="Software verification and validation">Software verification and validation</a></li>
<li><a href="Structured_analysis" title="Structured analysis">Structured analysis</a>
<ul><li><a href="Essential_systems_analysis" title="Essential systems analysis">Essential analysis</a></li></ul></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Orientations</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Agile_software_development" title="Agile software development">Agile</a></li>
<li><a href="Aspect-oriented_programming" title="Aspect-oriented programming">Aspect-oriented</a></li>
<li><a href="Object-oriented_programming" title="Object-oriented programming">Object orientation</a></li>
<li><a href="Ontology_(information_science)" title="Ontology (information science)">Ontology</a></li>
<li><a href="Systems_development_life_cycle" title="Systems development life cycle">SDLC</a></li>
<li><a href="Service-oriented_architecture" title="Service-oriented architecture">Service orientation</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Models</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">Developmental</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Agile_software_development" title="Agile software development">Agile</a></li>
<li><a href="Enterprise_unified_process" title="Enterprise unified process">EUP</a></li>
<li><a href="Executable_UML" title="Executable UML">Executable UML</a></li>
<li><a href="Incremental_build_model" title="Incremental build model">Incremental model</a></li>
<li><a href="Iterative_and_incremental_development" title="Iterative and incremental development">Iterative model</a></li>
<li><a href="Software_prototyping" title="Software prototyping">Prototype model</a></li>
<li><a href="Rapid_application_development" title="Rapid application development">RAD</a></li>
<li><a href="Scrum_(software_development)" title="Scrum (software development)">Scrum</a></li>
<li><a href="Spiral_model" title="Spiral model">Spiral model</a></li>
<li><a href="Unified_process" title="Unified process">UP</a></li>
<li><a href="V-model_(software_development)" title="V-model (software development)">V-model</a></li>
<li><a href="Waterfall_model" title="Waterfall model">Waterfall model</a></li>
<li><a href="Extreme_programming" title="Extreme programming">XP</a></li>
<li><a href="Model-driven_engineering" title="Model-driven engineering">Model-driven engineering</a></li>
<li><a href="Round-trip_engineering" title="Round-trip engineering">Round-trip engineering</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">Other</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Capability_Maturity_Model_Integration" title="Capability Maturity Model Integration">CMMI</a></li>
<li><a href="Data_model" title="Data model">Data model</a></li>
<li><a href="Entity%E2%80%93relationship_model" title="Entity–relationship model">ER model</a></li>
<li><a href="Function_model" title="Function model">Function model</a></li>
<li><a href="Information_model" title="Information model">Information model</a></li>
<li><a href="Metamodeling" title="Metamodeling">Metamodeling</a></li>
<li><a href="Object_model" title="Object model">Object model</a></li>
<li><a href="ISO/IEC_15504" title="ISO/IEC 15504">SPICE</a></li>
<li><a href="Systems_modeling" title="Systems modeling">Systems model</a></li>
<li><a href="View_model" title="View model">View model</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;">Languages</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="IDEF" title="IDEF">IDEF</a></li>
<li><a href="Systems_modeling_language" title="Systems modeling language">SysML</a></li>
<li><a href="Unified_Modeling_Language" title="Unified Modeling Language">UML</a></li>
<li><a href="Universal_Systems_Language" title="Universal Systems Language">USL</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Systems_design" title="Systems design">Systems design</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Software_requirements_specification" title="Software requirements specification"> Requirements</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Functional_requirement" title="Functional requirement">Functional requirement</a></li>
<li><a href="Non-functional_requirement" title="Non-functional requirement">Non-functional requirement</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Capacity_planning" title="Capacity planning"> Capacity</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Active_users" title="Active users"> Users</a></li>
<li><a href="Central_processing_units" class="mw-redirect" title="Central processing units"> Compute</a></li>
<li><a href="Computer_memory" title="Computer memory"> Memory</a></li>
<li><a href="Computer_data_storage" title="Computer data storage"> Storage</a></li>
<li><a href="Bandwidth_(computing)" title="Bandwidth (computing)"> Network</a></li>
<li><a href="Web_traffic" title="Web traffic">Web traffic</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Interface_(computing)" title="Interface (computing)"> Interface</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="API" title="API">API</a></li>
<li><a href="SOAP" title="SOAP">SOAP</a></li>
<li><a href="REST" title="REST">REST</a></li>
<li><a href="GraphQL" title="GraphQL">GraphQL</a></li>
<li><a href="GRPC" title="GRPC">gRPC</a></li>
<li><a href="Webhook" title="Webhook">Webhook</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="High-level_design" title="High-level design">High-level design</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Client_(computing)" title="Client (computing)"> Client</a></li>
<li><a href="Load_balancing_(computing)" title="Load balancing (computing)"> Load balancing</a></li>
<li><a href="Application_server" title="Application server">Application server</a></li>
<li><a href="Message_queue" title="Message queue">Message queue</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="System_Integration" class="mw-redirect" title="System Integration"> Integration</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Vertical_integration" title="Vertical integration"> Vertical</a></li>
<li><a href="Peer-to-peer" title="Peer-to-peer">Peer-to-peer</a></li>
<li><a href="API_management" title="API management"> API Gateway</a></li>
<li><a href="Publish%E2%80%93subscribe_pattern" title="Publish–subscribe pattern"> pub-sub</a></li>
<li><a href="Event_store" title="Event store"> Event Source</a></li>
<li><a href="Extract%2C_transform%2C_load" title="Extract, transform, load"> ETL</a></li>
<li><a href="Batch_processing" title="Batch processing"> Batch</a></li>
<li><a href="Stream_processing" title="Stream processing">Stream</a></li>
<li><a href="Orchestration_(computing)" title="Orchestration (computing)"> Orchestration</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Architectures" class="mw-redirect" title="Architectures">Architectures</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Monolithic_application" title="Monolithic application"> Monolithic</a></li>
<li><a href="Microservices" title="Microservices">Microservices</a></li>
<li><a href="Event-driven_architecture" title="Event-driven architecture"> Event-Driven</a></li>
<li><a href="Client%E2%80%93server_model" title="Client–server model"> Client–server</a></li>
<li><a href="Serverless_computing" title="Serverless computing"> Serverless</a></li>
<li><a href="Circuit_breaker_design_pattern" title="Circuit breaker design pattern"> Circuit breaker</a></li>
<li><a href="Rate_limiting" title="Rate limiting">Rate limiting</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Database" title="Database">Database</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Relational_database" title="Relational database"> Relational</a></li>
<li><a href="NoSQL" title="NoSQL">NoSQL</a></li>
<li><a href="Graph_database" title="Graph database"> Graph</a></li>
<li><a href="Key%E2%80%93value_database" title="Key–value database"> Key–value</a></li>
<li><a href="Log-structured_merge-tree" title="Log-structured merge-tree"> LSM Tree </a></li>
<li><a href="Time_series_database" title="Time series database"> Time series</a></li>
<li><a href="Data_orientation" title="Data orientation"> Column Oriented</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Systems_design" title="Systems design"> Principles</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Consistency_(database_systems)" title="Consistency (database systems)">Consistency</a></li>
<li><a href="Reliability_engineering" title="Reliability engineering">Reliability</a></li>
<li><a href="CAP_theorem" title="CAP theorem">CAP theorem</a></li>
<li><a href="Software_maintenance" title="Software maintenance"> Maintainability</a></li>
<li><a href="Computer_configuration" title="Computer configuration"> Configurability</a></li>
<li><a href="Modularity" title="Modularity">Modularity</a></li>
<li><a href="Durability_(database_systems)" title="Durability (database systems)"> Durability</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Scalability" title="Scalability">Scalability</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Service_statelessness_principle" title="Service statelessness principle"> Stateless</a></li>
<li><a href="Asynchronous_I/O" title="Asynchronous I/O">Asynchronous I/O</a></li>
<li><a href="Loose_coupling" title="Loose coupling">Loose coupling</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Availability" title="Availability">Availability</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Fault_tolerance" title="Fault tolerance">Fault tolerance</a></li>
<li><a href="Failover" title="Failover">Failover</a></li>
<li><a href="Single_point_of_failure" title="Single point of failure">Single point of failure</a></li>
<li><a href="Replication_(computing)" title="Replication (computing)"> Replication</a></li>
<li><a href="Consistent_hashing" title="Consistent hashing">Consistent hashing</a></li>
<li><a href="Circuit_breaker_design_pattern" title="Circuit breaker design pattern"> Circuit breaker</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Latency_(engineering)" title="Latency (engineering)">Latency</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Cache_(computing)" title="Cache (computing)"> Cache</a></li>
<li><a href="Content_delivery_network" title="Content delivery network"> CDN</a></li>
<li><a href="Shard_(database_architecture)" title="Shard (database architecture)"> Shard </a></li>
<li><a href="Database_index" title="Database index">Database index</a></li>
<li><a href="Cache_prefetching" title="Cache prefetching"> Pre-caching</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Computer_data_storage" title="Computer data storage"> Storage</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Object_storage" title="Object storage">Object storage</a></li>
<li><a href="Block-level_storage" title="Block-level storage"> Block storage</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%;font-weight:normal;"><a href="Observability_(software)" title="Observability (software)"> Observability</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Logging_(computing)" title="Logging (computing)"> Logging</a></li>
<li><a href="Software_metric" title="Software metric"> Metrics</a></li>
<li><a href="Tracing_(software)" title="Tracing (software)"> Tracing </a></li>
<li><a href="Failure_rate" title="Failure rate"> Error rate </a></li>
<li><a href="Queries_per_second" title="Queries per second">Queries per second </a></li>
<li><a href="Notification_system" title="Notification system">Notification system</a></li>
<li><a href="Anomaly_detection" title="Anomaly detection">Anomaly detection</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Related fields</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Computer_engineering" title="Computer engineering">Computer engineering</a></li>
<li><a href="Computer_science" title="Computer science">Computer science</a></li>
<li><a href="Information_science" title="Information science">Information science</a></li>
<li><a href="Project_management" title="Project management">Project management</a></li>
<li><a href="Risk_management" title="Risk management">Risk management</a></li>
<li><a href="Systems_engineering" title="Systems engineering">Systems engineering</a></li></ul>
</div></td></tr><tr><td class="navbox-abovebelow" colspan="2" style="font-weight:bold;"><div>
<ul><li><span class="noviewer" typeof="mw:File"><span title="Category"></span></span> Category</li>
<li><span class="noviewer" typeof="mw:File"><span title="Commons page"></span></span> <a href="https://commons.wikimedia.org/wiki/Category:Software_engineering" class="extiw external" title="commons:Category:Software engineering">Commons</a></li></ul>
</div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-08-05" href="https://en.wikipedia.org/wiki/?title=Feature_model&amp;oldid=1304314517">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>